package com.ac.scum.log.web.model.ftp.controller;

import com.ac.common.core.exception.BaseException;
import com.ac.common.core.exception.config.ExceptionType;
import com.ac.common.core.result.Result;
import com.ac.scum.log.bean.ServerFTP;
import com.ac.scum.log.web.model.ftp.service.ServerFTPService;
import com.ac.scum.log.web.model.server.service.ServerService;
import com.ac.scum.log.web.utils.user.CurrentUserUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.Objects;

/**
 * 服务器FTP
 */
@RestController
@RequestMapping("server/ftp")
@AllArgsConstructor
public class ServerFTPController {

    private final ServerFTPService serverFTPService;
    private final ServerService serverService;


    /**
     * 获取FTP服务器配置信息
     * 该接口不需要参数，通过服务器ID获取当前登录用户的FTP服务器配置信息。
     *
     * @return Result<ServerFTP> 返回一个包含FTP服务器配置信息的结果对象。如果成功，结果对象的data字段将包含FTP配置信息；如果失败，结果对象将包含错误信息。
     * @throws BaseException 如果获取FTP配置信息过程中发生错误，将抛出基础异常。
     */
    @GetMapping("info")
    public Result<ServerFTP> getFTPConfigInfo() throws BaseException {
        return Result.ok(serverFTPService.getOne(Wrappers.lambdaQuery(ServerFTP.class).eq(ServerFTP::getServerId, CurrentUserUtil.getCurrentServerId())));
    }

    /**
     * 插入或更新服务器FTP配置信息。
     *
     * @param serverFTP 包含服务器FTP配置信息的对象。该对象可以包含ID或服务器ID，用于确定是更新还是插入操作。
     * @return 返回操作结果，包括操作成功的服务器FTP信息。
     * @throws BaseException 如果服务器ID或ID为空，或当前用户无权操作该服务器时抛出异常。
     */
    @PostMapping
    public Result<ServerFTP> insertOrUpdate(@RequestBody ServerFTP serverFTP) throws BaseException {
        serverFTP.setServerId(CurrentUserUtil.getCurrentServerId());
        Long currentLoginUserId = CurrentUserUtil.getCurrentLogUser().getId();
        ServerFTP serverDBConfig = serverFTPService.getOne(Wrappers.lambdaQuery(ServerFTP.class).eq(ServerFTP::getServerId, serverFTP.getServerId()));

        if (Objects.isNull(serverFTP.getId())) {
            serverFTPService.save(serverFTP);
        } else if (serverDBConfig != null && serverFTP.getId().equals(serverDBConfig.getId())) {
            Long serverId = serverFTP.getServerId() == null ? serverFTPService.getById(serverFTP.getId()).getServerId() : serverFTP.getServerId();
            if (serverService.getUserIdsByServerId(serverId).stream().anyMatch(item -> item.equals(currentLoginUserId))) {
                serverFTPService.updateById(serverFTP);
            } else {
                throw new BaseException(ExceptionType.Parameter_Error.of("你没有权限操作该服务器"));
            }
        } else {
            throw new BaseException(ExceptionType.Parameter_Error.of("非法操作"));
        }
        return Result.ok(serverFTP);
    }
}
